// core:核心  存放操作数据库的核心代码
const { MongoClient } = require('mongodb');
const { db } = require('../config')
// console.log('db', db); // { url: 'mongodb://localhost:27017', name: 'z-blog' }

async function connect(collectionName, callback, dbName = db.name, url = db.url) {
    //  获取客户端实例
    const client = new MongoClient(url)
    try {
        await client.connect() //连接客户端
        // 获取db 实例
        const db = client.db(dbName)
        // 获取集合实例
        const collection = db.collection(collectionName)
        // console.log('collection', collection);
        // 执行命令  换成 回调函数
        // 调用回调函数 callback，callback中写的就是操作数据库的各种业务代码，需要我们把collection集合实例传给回调函数中进行使用
        const result = await callback(collection)
        // 获取了操作数据库的结果之后， 关闭客户端
        client.close()
        // 把最终的结果进行返回（注意：async函数返回的结果都是 promise对象）
        return result
    } catch (e) {
        // 关闭连接
        await client.close()
        // 因为 async函数 必须返回 promise 对象，出现了错误的情况的话，返回 状态为 rejected 的 promise对象
        return Promise.reject(e)
    }
}

// 再封装一些数据库的通用方法  findOne() findMany() insertOne() insertMany()

// 把这些方法 导出
exports.findOne = function (collectionName, query = {}) {
    return connect(collectionName, (collection) => {
        return collection.findOne(query)
    })
}
exports.findMany = function (collectionName, query = {}, limit = 5, skip = 0, sort = { _id: 1 }) {
    return connect(collectionName, (collection) => {
        return collection.find(query).limit(limit).skip(skip).sort(sort).toArray()
    })
}
exports.insertOne = (collectionName, data) => connect(collectionName, collection => collection.insertOne(data))
exports.updateOne = (collectionName, query, data) => connect(collectionName, collection => collection.updateOne(query, data))
exports.deleteOne = (collectionName, query) => connect(collectionName, collection => collection.deleteOne(query))


// 用来查询文档的数量
exports.count = (collectionName, query = {}) => connect(collectionName, collection => collection.count(query))








